#include "NCU_Jeu.h"
#include <time.h>
#include <assert.h>
#include <math.h>


int NCU_positioncasex(double x, NCU_Jeu*J)
{
    float x_sansarrondi;
    float x_arrondi;
    float ecart;
    int pos;

    x_sansarrondi = x/((double)TAILLEBLOC)+((double)getdimxJeu(&J->J))/2.0;
    x_arrondi = (floor(x/((double)TAILLEBLOC)+((double)getdimxJeu(&J->J))/2.0));
    ecart = x_sansarrondi-x_arrondi;
    if (ecart<=0.3)
    {
        pos = 0;
    }
    if ((ecart>0.3) && (ecart < 0.6))
    {
        pos = 1;
    }
    if (ecart >= 0.6)
    {
        pos = 2;
    }

    return pos;
}

int NCU_positioncasey(double y, NCU_Jeu * J)
{
    float y_sansarrondi;
    float y_arrondi;
    float ecart;
    int pos;

    y_sansarrondi = y/((double)TAILLEBLOC)+((double)getdimyJeu(&J->J))/2.0;
    y_arrondi = (floor(y/((double)TAILLEBLOC)+((double)getdimyJeu(&J->J))/2.0));
    ecart = y_sansarrondi-y_arrondi;
    if (ecart<= 0.3)
    {
        pos = 0;
    }
    if ((ecart > 0.3) && (ecart < 0.6))
    {
        pos = 1;
    }
    if (ecart >= 0.6)
    {
        pos = 2;
    }
    return pos;
}
int NCU_changex(double x, NCU_Jeu * J)
{
    float x_arrondi;
    x_arrondi = (floor(x/((double)TAILLEBLOC)+((double)getdimxJeu(&J->J))/2.0));
    return (int)x_arrondi;
}

int NCU_changey(double y, NCU_Jeu * J)
{
    float y_arrondi;
    y_arrondi = (floor(y/((double)TAILLEBLOC)+((double)getdimyJeu(&J->J))/2.0));
    return (int)y_arrondi;
}
void NCU_Menu(WINDOW* win, const NCU_Jeu *J)
{
  wclear(win);
  mvwprintw(win, 2, getdimxJeu(&J->J)/2, "Une Retraite En Enfer");
  mvwprintw(win, 3, 3, "Menu de démarrage");
  mvwprintw(win, 4, 3, "1: Nouvelle partie");
  mvwprintw(win, 5, 3, "ESC : quitter le jeu");
  wmove(win, getdimyJeu(&J->J)+10,getdimxJeu(&J->J)+10);
}


void NCU_Aff( WINDOW* win,NCU_Jeu *J)
{
    int x,y,i,j,z, idobj;
    float horloge_courante;
    float chrono;
    horloge_courante = (float)clock()/(float)CLOCKS_PER_SEC;
    chrono = horloge_courante - J->debut_jeu;
    wclear(win);
    start_color();
    init_pair(1, COLOR_GREEN, COLOR_WHITE);
    init_pair(2, COLOR_BLUE, COLOR_WHITE);
    init_pair(3, COLOR_RED, COLOR_WHITE);
    init_pair(4, COLOR_BLACK, COLOR_WHITE);
    wattron(win, COLOR_PAIR(1));
		 /** Affichage des cases du terrain **/
	for(x=0;x<getdimxJeu(&J->J);++x)
	{
                for(y=0;y<getdimyJeu(&J->J);++y)
		{
		    if (getCaseJeu(&J->J, x, y) == 'm') // case normales
		    {
		        mvwprintw(win, (3*y), (3*x), "___");
		        mvwprintw(win, (3*y)+1, (3*x), "___");
		        mvwprintw(win, (3*y)+2, (3*x), "___");
		    }
		    if (getCaseJeu(&J->J, x, y) == 'b') // case bloc
		    {
		        mvwprintw(win, (3*y), (3*x), "|-|");
		        mvwprintw(win, (3*y)+1, (3*x), "|b|");
		        mvwprintw(win, (3*y)+2, (3*x), "|-|");
		    }
		    if (getCaseJeu(&J->J, x, y) == 'k') // case cassable
		    {
		        mvwprintw(win, (3*y), (3*x), "|-|");
		        mvwprintw(win, (3*y)+1, (3*x), "|k|");
		        mvwprintw(win, (3*y)+2, (3*x), "|-|");
		    }
		    if (getCaseJeu(&J->J, x, y) == 'K') // case cassée
		    {
		        mvwprintw(win, (3*y), (3*x), "___");
		        mvwprintw(win, (3*y)+1, (3*x), "___");
		        mvwprintw(win, (3*y)+2, (3*x), "___");
		    }
		    if (getCaseJeu(&J->J, x, y) == 'C') // case coffre
		    {
		        mvwprintw(win, (3*y), (3*x), "|-|");
		        mvwprintw(win, (3*y)+1, (3*x), "|.|");
		        mvwprintw(win, (3*y)+2, (3*x), "|-|");
		    }
		    if (getCaseJeu(&J->J, x, y) == 'c') // case coffre ouvert
		    {
		        mvwprintw(win, (3*y), (3*x), "|-|");
		        mvwprintw(win, (3*y)+1, (3*x), "| |");
		        mvwprintw(win, (3*y)+2, (3*x), "|-|");
		    }

		}
	}
	/** Affichage des consommable **/
	for (z=0;z<getnbObjetJeu(&J->J);z++)
	{
	    idobj=getidObjetJeu(&J->J,z);
        x = NCU_changex((double)getxObjetJeu(&J->J,z),J);
        y = NCU_changey((double)getyObjetJeu(&J->J,z),J);
	    if (idobj==ID_VIEMAX)
	    {
            mvwprintw(win, 3*y+1, 3*x+1, "V" );
	    }
	    if (idobj==ID_VIE)
	    {

            mvwprintw(win, 3*y+1, 3*x+1, "V" );
	    }
	    if (idobj==ID_VITESSE)
	    {
	        mvwprintw(win, 3*y, 3*x, "-/-" );
            mvwprintw(win, 3*y+1, 3*x, "-\\-" );
            mvwprintw(win, 3*y+2, 3*x, "-/-" );
	    }
	    if (idobj==ID_CADENCE)
	    {

            mvwprintw(win, 3*y+1, 3*x+1, "C" );
	    }
	    if (idobj==ID_PORTEE)
	    {
            mvwprintw(win, 3*y+1, 3*x+1, "p" );
	    }
	    if (idobj==ID_FORCE)
	    {
            mvwprintw(win, 3*y+1, 3*x+1, "F" );
	    }
	    else
	    {
	        mvwprintw(win, 3*y+1, 3*x+1, "A" );
	    }


	}
	wattroff(win, COLOR_PAIR(1));
	/** Affichage du personnage **/
	wattron(win, COLOR_PAIR(2));
    x = NCU_changex(GetPosdoubxPerso(J->J.hero),J);
    y = NCU_changey(GetPosdoubyPerso(J->J.hero),J);
    i = NCU_positioncasex(GetPosdoubxPerso(J->J.hero),J);
    j = NCU_positioncasey(GetPosdoubyPerso(J->J.hero),J);
    mvwprintw(win, 3*y+j, 3*x+i, "J" );
	wattroff(win, COLOR_PAIR(2));
	/** Affichage des monstres **/
	wattron(win, COLOR_PAIR(3));
	for (z=0; z<getnbMonstreJeu(&J->J); z++)
	{
	    x = NCU_changex((double)getxMonstresJeu(&J->J,z),J);
	    y = NCU_changey((double)getyMonstresJeu(&J->J,z),J);
	    i = NCU_positioncasex((double)getxMonstresJeu(&J->J,z),J);
	    j = NCU_positioncasey((double)getyMonstresJeu(&J->J,z),J);
	    mvwprintw(win, 3*y+j, 3*x+i, "O");
	}
	wattroff(win, COLOR_PAIR(3));
	/** Affichage des tirs **/
	/** Amis **/
	wattron(win, COLOR_PAIR(2));
    for (z=0;z<getnbTirsheroJeu(&J->J);z++)
    {
        x = NCU_changex((double)getxTirsheroJeu(&J->J,z),J);
        y = NCU_changey((double)getyTirsheroJeu(&J->J,z),J);
        i = NCU_positioncasex((double)getxTirsheroJeu(&J->J,z),J);
        j = NCU_positioncasey((double)getyTirsheroJeu(&J->J,z),J);
        mvwprintw(win, 3*y+j, 3*x+i, "-");
    }
    wattroff(win, COLOR_PAIR(2));
    /** Ennemis **/
    wattron(win, COLOR_PAIR(3));
    for (z=0;z<getnbTirsennemiJeu(&J->J);z++)
    {
        x = NCU_changex((double)getxTirsennemiJeu(&J->J,z),J);
        y = NCU_changey((double)getyTirsennemiJeu(&J->J,z),J);
        i = NCU_positioncasex((double)getxTirsennemiJeu(&J->J,z),J);
        j = NCU_positioncasey((double)getyTirsennemiJeu(&J->J,z),J);
        mvwprintw(win, 3*y+j, 3*x+i, "-");
    }
    wattroff(win, COLOR_PAIR(3));
    wattron(win, COLOR_PAIR(4));
    mvwprintw(win, (3*getdimyJeu(&J->J))+5, (3*getdimxJeu(&J->J))/2, "Une retraite en enfer");
    mvwprintw(win, (3*getdimyJeu(&J->J))+7, 2, "PV : %d \n Arme en main : %d \n ESC pour quitter \n z/q/s/d pour tirer \n a pour changer d'armes \n e pour ramasser objet \n Flèches pour se déplacer \n 0 pour s'arreter \n Chrono : %0.1f", GetPointVieheroJeu(&J->J), getidObjet1heroJeu(&J->J), chrono);
    wattroff(win, COLOR_PAIR(4));
    wmove(win, (3*getdimyJeu(&J->J))+10,(3*getdimxJeu(&J->J))+10);
}

void NCU_Boucle(NCU_Jeu *J)
{
	WINDOW *win, *screen;
	int c;
	int continue_boucle;
	int cont_menu;
	 /* Horloges (en secondes) */
	float horloge_courante, horloge_precedente;

	/* Intervalle de temps (en secondes) entre deux évolutions du jeu */
	float intervalle_horloge = 0.05f;

	initJeu(&J->J);
	screen = initscr();		/* passe l'écran texte en mode NCurses */
	clear();		/* efface l'écran */
	noecho();  	/* Lorsqu'une touche est préssée au clavier, elle n'apparait pas à l'écran */
	cbreak();		/* un caractère est directement affiché, il ne passe pas dans un buffer */

	/* Creation d'une nouvelle fenetre en mode texte */
	/* => fenetre de dimension et position ( WIDTH, HEIGHT, STARTX,STARTY) */
	win = newwin( (5*getdimxJeu(&J->J))+50, (5*getdimyJeu(&J->J))+50, 0, 0);
	keypad(win, TRUE);		/* pour que les flèches soient traitées (il faut le faire après création de la fenêtre) */

	/*halfdelay(temps_dizieme);*/
	/* notimeout(win,true); */
	/* wtimeout( win, 500 ); */
	nodelay(win,true); /* Pour que l'appel à wgetch soit non-bloquant */

	continue_boucle = 1;
	cont_menu = 1;
	NCU_Menu(win, J);
	do
	{

	  c = wgetch(win);
	  switch(c)
	  {
	    case '1':
	      J->debut_jeu = (float)clock()/(float)CLOCKS_PER_SEC;
	      cont_menu = 0;
	      break;
	    case 27:
	      cont_menu = 0;
	      continue_boucle = 0;
	      break;
	    default:
	      cont_menu = 1;
	      break;
	  }
	} while(cont_menu == 1);


	/* Récupère l'horloge actuelle et la convertit en secondes */
	/* clock() retourne le nombre de tops horloge depuis le lancement du programme */
	horloge_precedente = (float)clock()/(float)CLOCKS_PER_SEC;
	NCU_Aff( win, J);

	do
	{
	    if (GetPointVieheroJeu(&J->J) == 0)
            continue_boucle = 0;
        /* Récupère l'horloge actuelle et la convertit en secondes */
        /* clock() retourne le nombre de tops horloge depuis le lancement du programme */
        horloge_courante = (float)clock()/(float)CLOCKS_PER_SEC;

        if (horloge_courante-horloge_precedente>=intervalle_horloge)
        {
                actionsJeu(&J->J,horloge_courante-horloge_precedente);
                NCU_Aff( win, J);
                horloge_precedente = horloge_courante;
        }


		c = wgetch(win);

		switch(c)
		{
		  case KEY_LEFT:
				setallerhorJeu(&J->J,-1);
				setallervertJeu(&J->J,0);
				break;
		  case KEY_RIGHT:
				setallerhorJeu(&J->J,1);
				setallervertJeu(&J->J,0);
				break;
		  case KEY_UP:
                setallerhorJeu(&J->J,0);
                setallervertJeu(&J->J,-1);
                break;
		  case KEY_DOWN:
                setallerhorJeu(&J->J,0);
                setallervertJeu(&J->J,1);
                break;
		  case 'a':
                EchangerObjetJeu(&J->J);
                break;
		  case 'e':
                RamasserObjetJeu(&J->J);
                break;
		  case 'q':
                ajouterTirJeu(&J->J,M_PI);
                break;
		  case 'd':
                ajouterTirJeu(&J->J,0);
                break;
		  case 'z':
                ajouterTirJeu(&J->J,-M_PI/2.0);
                break;
		  case 's':
                ajouterTirJeu(&J->J,M_PI/2.0);
                break;
		  case '0':
                setallerhorJeu(&J->J,0);
                setallervertJeu(&J->J,0);
                break;
		  case 27: /* ECHAP */
				continue_boucle = 0;
				break;
		}

	} while (continue_boucle==1);

    assert(delwin(win)!=ERR);
    assert(delwin(screen)!=ERR);

	endwin();
}
